﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.ModelBinding;
using System.Web.UI;
using System.Web.UI.WebControls;
using Box.BL;
using Box.Entities;
using Microsoft.Practices.Unity;

namespace Box.Cliente.Confeccion
{
    public partial class frmNotaPedidoConfeccion : System.Web.UI.Page
    {
        private const string KEYNOTA = "nota";
        [Dependency]
        public IProductoBL productoService { get; set; }
        [Dependency]
        public INotaPedidoBL notaPedidoService { get; set; }
        protected void Page_Load(object sender, EventArgs e)
        {
            var opc = Request.QueryString["opc"];
            var idNota = Request.QueryString["id"];
            

            if (!Page.IsPostBack)
            {
                if (opc!=null && opc== "nuevo")
                {
                    var nuevaOrden = new NotaPedido()
                    {
                        FechaPedido = DateTime.Now
                    };

                    BindingNota(nuevaOrden);
                    ViewState["opc"] = opc;
                }else if (opc!=null && opc== "editar" && idNota !=null)
                {
                    var nota = notaPedidoService.GetFromNotaPEdidoById(Int32.Parse(idNota));

                    cbEstado.SelectedValue = nota.EstadoAlmacen;
                    BindingNota(nota);

                    ViewState["opc"] = opc;
                }
               
            }
        }

        #region Biding

        private void BindingNota(NotaPedido notaPedido)
        {
            txtNumOrden.Text = notaPedido.Id.ToString();

            if (notaPedido.FechaPedido!=null)
            {
                txtComentario.Text = notaPedido.ComentarioPedido;
            }
            notaPedido.Total = notaPedido.DetalleNotaPedido.Sum(dn => dn.Monto);
            lvDetalleNota.DataSource = notaPedido.DetalleNotaPedido;
            lvDetalleNota.DataBind();

            var lblTotal = lvDetalleNota.FindControl("lblTotal") as Label;

            if (lblTotal!=null)
            {
                lblTotal.Text = notaPedido.Total.ToString();
            }
            Cache.Insert(KEYNOTA,notaPedido);
        }

        #endregion

        private NotaPedido GetNota()
        {
            return Cache.Get(KEYNOTA) as NotaPedido;
        }

        public IQueryable<Producto> GetProductos([Control("txtCriterio")] string criterio)
        {
            return productoService.GetFromProductosByCriterio(criterio).AsQueryable();
        }

        protected void lvProductos_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "AddDetalle")
            {
                var productoId = Int32.Parse(e.CommandArgument.ToString());


                var nota = GetNota();

                var existe = nota.DetalleNotaPedido
                    .Where(dp => dp.IdProducto == productoId).SingleOrDefault();

                //var mismo = venta.DetalleVenta.Where(p =>(p.Producto.NombreProducto == p.Producto.NombreProducto) &&
                //    (p.Producto.Precio != productoPrecio.Precio)).SingleOrDefault();

                if (existe != null)
                {

                    existe.Cantidad += 1;


                }
                else
                {
                    var producto = productoService
                        .GetFromProductosById((productoId));

                    var newDetalle = new DetalleNotaPedido()
                    {
                        IdNotaPedido = nota.Id,
                        IdProducto = producto.Id,
                        Producto = producto,
                        PrecioUnit = producto.Precio,
                        Cantidad = 1
                    };

                    nota.DetalleNotaPedido.Add(newDetalle);
                }
                //venta.Total = venta.DetalleVenta.Sum(i => i.Monto);

                BindingNota(nota);
            }
        }

        #region ya no mas boton update
        protected void txtCantidad_TextChanged(object sender, EventArgs e)
        {
            try
            {
                var _nota = GetNota();

            
                    foreach (var row in lvDetalleNota.Items)
                    {
                        var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                        var txtPrecio = row.FindControl("txtPrecio") as TextBox;

                        _nota.DetalleNotaPedido.ToList()[row.DisplayIndex].Cantidad = int.Parse(txtCantidad.Text);
                        _nota.DetalleNotaPedido.ToList()[row.DisplayIndex].PrecioUnit = decimal.Parse(txtPrecio.Text);
                    }

                    BindingNota(_nota);
            }
            catch (Exception)
            {
                
                Response.Redirect("~/RedireccionErrores/500.aspx");
            }
            
        }
        protected void txtPrecio_TextChanged(object sender, EventArgs e)
        {
            var _nota = GetNota();

           
            foreach (var row in lvDetalleNota.Items)
            {
                var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                var txtPrecio = row.FindControl("txtPrecio") as TextBox;

                _nota.DetalleNotaPedido.ToList()[row.DisplayIndex].Cantidad = int.Parse(txtCantidad.Text);
                _nota.DetalleNotaPedido.ToList()[row.DisplayIndex].PrecioUnit = decimal.Parse(txtPrecio.Text);
            }

            BindingNota(_nota);
        }
        #endregion

        protected void lvDetalleNota_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "QuitarDetalle")
            {
                var idProducto = Int32.Parse(e.CommandArgument.ToString());

                //recupera pedido del cache
                var nota = GetNota();

                var detalle = nota.DetalleNotaPedido.
                    Where(dp => dp.IdProducto == idProducto).SingleOrDefault();

                if (detalle != null)
                {
               
                nota.DetalleNotaPedido.Remove(detalle);
                   }
            BindingNota(nota);
            }
            else if (e.CommandName == "ActualizarDetalle")
            {
                var _nota = GetNota();

                //var valorCantidad= lvDetalleVenta.FindControl("txtCantidad") as TextBox;
                //var valorPrecio = lvDetalleVenta.FindControl("txtPrecio") as TextBox;

                //if (decimal.Parse(valorPrecio.Text)>0 && venta.DetalleVenta.Count()>0)
                //{
                foreach (var row in lvDetalleNota.Items)
                {
                    var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                    var txtPrecio = row.FindControl("txtPrecio") as TextBox;

                    _nota.DetalleNotaPedido.ToList()[row.DisplayIndex].Cantidad = int.Parse(txtCantidad.Text);
                    _nota.DetalleNotaPedido.ToList()[row.DisplayIndex].PrecioUnit = decimal.Parse(txtPrecio.Text);
                }

                BindingNota(_nota);
            }
        }

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            var nota = GetNota();

            nota.FechaPedido = DateTime.Now;
            

            if (nota!=null)
            {
                if (ViewState["opc"].ToString()=="nuevo")
                {
                    
                        nota.EstadoConfeccion = cbEstado.SelectedValue;
                        nota.ComentarioPedido = txtComentario.Text;
                        
                        nota.Estado = true;
                        notaPedidoService.AddNotaPEdido(nota);
                        Response.Redirect("frmListNotaPedidoConfeccion.aspx");
                    
                }else if (ViewState["opc"].ToString()=="editar")
                {
                    
                        nota.EstadoConfeccion = cbEstado.SelectedValue;
                        nota.Estado = true;
                        nota.ComentarioPedido = txtComentario.Text;
                        notaPedidoService.UpdateNotaPedido(nota);
                        Response.Redirect("frmListNotaPedidoConfeccion.aspx");
                   
                }
            }

        }

        protected void txtNumOrden_TextChanged(object sender, EventArgs e)
        {

        }

    }
}